Tina za vsak obrok, ki ga poje, zapiše njegovo kalorično vrednost (celo število). Vse te podatke hrani v datoteki: podatke vsakega dne zapiše v svojo vrstico, znotraj vrstice pa jih loči z vejico.
Sestavite funkcijo kalorijeNaDan(datoteka)
, ki kot parameter dobi ime
vhodne datoteke in vrne seznam kalorij, ki jih je Tina dnevno zaužila.
Torej, za vsako vrstico v datoteki (ki predstavlja en dan) dodaj v seznam eno število, ki naj bo enako vsoti kalorij za tisti dan.
def skupneKalorije(niz): '''sešteje cela števila v nizu, ki so ločena z vejico''' tabelaNizov = niz.split(',') skupnaVsota = 0 for elt in tabelaNizov: skupnaVsota += int(elt) # ne pozabi pretvoriti niza v število! return skupnaVsota def kalorijeNaDan(datoteka): '''Seznam kalorij, zaužitih na posamezni dan''' zaužiteKalorije = [] for vrstica in open(datoteka): # uporabimo zgornjo funkcijo, ki "obdela" vrstico in seštejemo naTaDan = skupneKalorije(vrstica) zaužiteKalorije.append(naTaDan) return zaužiteKalorije
Sestavite funkcijo vsotaKalorij(vhod, izhod)
, ki kot argumenta dobi
imeni dveh datotek: vhodno (ta vsebuje Tinine zapiske) in izhodno. Na
izhodno datoteko naj za vsako vrstico v vhodni datoteki zapiše vsoto
kaloričnih vrednosti zaužite hrane tistega dne. Vsako število v izhodni
datoteki naj bo v svoji vrstici.
def vsotaKalorij(vhod, izhod): '''za vsako vrstico v vhodni datoteki zapiše vsoto na izhodno datoteko''' piši = open(izhod, 'w') for vrstica in open(vhod): vsota = skupneKalorije(vrstica) # izračuna vsoto števil v vrstici piši.write(str(vsota) + '\n') piši.close()
Sestavite funkcijo povprecjeKalorij(vhod, izhod)
, ki kot argumenta dobi
imeni dveh datotek: vhodno in izhodno. Na izhodno datoteko naj za vsako
vrstico na vhodni datoteki zapiše zaporedno številko vrstice (vrstice se
začno šteti z ena) ter povprečno kalorično vrednost obrokov, ki jih je
Tina zaužila tisti dan, na dve decimalni mesti natančno. V zadnjo (dodatno)
vrstico pa naj funkcija zapiše dnevno povprečje zaužitih kalorij (prav
tako na dve decimalni mesti natančno).
def vrniKalorije(niz): '''iz niza, v katerem so števila ločena z vejicami, vrne seznam teh celih števil.''' tabelaNizov = niz.split(',') izhTabela = [] for elt in tabelaNizov: izhTabela.append(int(elt)) # dodamo število, ki ga dobimo iz niza return izhTabela # lahko bi vse skupaj napisali tudi v eni vrstici # return list(map(int, niz.split(','))) def povprecjeKalorij(vhod,izhod): vsotaKalorij = 0 steviloDni = 0 piši = open(izhod, "w") for vrstica in open(vhod): obroki = vrniKalorije(vrstica) dnevniVnos = sum(obroki) steviloDni += 1 vsotaKalorij += dnevniVnos print("{0} {1:.2f}".format(steviloDni, dnevniVnos / len(obroki)), file=piši) # še končni podatek o povprečju print("{0:.2f}".format(vsotaKalorij / steviloDni), file=piši) piši.close()
V datoteki imamo zapisane podatke o vrednosti neke delnice. V vsaki vrstici je zapisan podatek v obliki
YYYY-MM-DD,vrednost
kjer je prvi podatek dan, drugi pa vrednost delnice na ta dan.
Sestavite funkcijo preberi(ime_datoteke)
, ki kot parameter sprejme
ime datoteke, vrne par nabor dveh seznamov, v prvem naj bodo datumi
(kot nizi), v drugem pa vrednosti delnice (kot realna števila).
def preberi(ime_datoteke): '''vrne par (nabor) dveh seznamov, v prvem so datumi (kot nizi), v drugem pa vrednosti delnice (kot realna števila). ''' datumi = [] vrednosti = [] for vrstica in open(ime_datoteke,'r'): v = vrstica.strip().split(',') # prvi podatek je datum, drugi vrednost datumi.append(v[0]) # datum dodamo nespremenjen vrednosti.append(float(v[1])) return (datumi, vrednosti)
Logaritemski povratek delnice je definiran kot logaritem kvocienta
vrednosti delnice za dva zaporedna dneva trgovanja.
Zakaj je to uporabno
Sestavite funkcijo
povratek(imeDat)
, ki kot parameter sprejme ime datoteke z vrednostmi delnice
in vrne seznam logaritemskih povratkov. Če je
podana datoteka prazna ali pa vsebuje le en podatek, naj funkcija vrne prazen
seznam.
from math import log def povratek(ime_datoteke): '''Vrne seznam logaritemskih popravkov''' datumi, vrednosti = preberi(ime_datoteke) povratki = [] for i in range(1,len(vrednosti)): #začnemo pri drugem dnevu povratki.append(log(vrednosti[i]/vrednosti[i-1])) return povratki
Iz logaritemskih povratkov lahko razberemo, ali je vrednost delnice
naraščala ali padala. Sestavite funkcijo trend(povratki)
, ki sprejme
seznam logaritemskih povratkov in vrne niz pozitiven trend
, če je
v seznamu več pozitivnih vrednosti kot negativnih, sicer pa naj vrne
negativen trend
. Vrednosti 0 štejte k negativnim.
def trend(povratki): '''Vrne niz "pozitiven trend", če je v seznamu logaritemskih povratkov več pozitivnih vrednosti kot negativnih, sicer pa "negativen trend"''' poz = 0 neg = 0 for x in povratki: if x > 0: poz += 1 else: neg += 1 if poz > neg: return 'pozitiven trend' else: return 'negativen trend'
Letna volatilnost
delnice (Volatilnost ali nihajnost označuje, koliko je statistično verjetno, da
cena delnice v kratkem času močneje zraste ali pade)
je definirana kot večkratnik standardnega
odklona logaritemskega povratka:
volatilnost(ime_datoteke)
, ki iz datoteke prebere
vrednosti delnice in vrne njeno letno volatilnost
from math import sqrt def volatilnost(ime): ''' iz datoteke prebere vrednosti delnice in vrne njeno letno volatilnost''' p = povratek(ime) n = len(p) mu = sum(p)/n # povprečna vrednost logaritemskih povratkov s2 = 0 for x in p: s2 += (x-mu)**2 return sqrt(252 * s2/n)
Sestavite funkcijo html2txt(vhod, izhod)
, ki bo vsebino datoteke z
imenom vhod
prepisala v datoteko z imenom izhod
, pri tem pa odstranila
vse značke. Vemo, da je datoteka HTML sestavljena prav!
Značke se začnejo z znakom <
in končajo z znakom >
. Pozor: Začetek in
konec značke nista nujno v isti vrstici. Takrat se vrstica nadaljuje!
Prav tako ima lahko značka lastnosti, npr. značka a
ima lastnost href
<a href = "kk.htm">
Na primer, če je v datoteki vreme.html
zapisano:
<h1>Napoved vremena</h1>
<p>Jutri bo <i><b>lepo</b></i> vreme.
Več o vremenu preberite <a
href="napoved.html">tukaj</a>.</p>
bo po klicu html2txt('vreme.html', 'vreme.txt')
v datoteki vreme.txt
zapisano (pozor na tretjo vrstico!):
Napoved vremena
Jutri bo lepo vreme.
Več o vremenu preberite tukaj.
def html2txt(vhod, izhod): ''' Funkcija vsebino datoteke z imenom vhod prepiše v datoteko z imenom izhod, pri tem pa odstrani vse značke za HTML. ''' html = open(vhod) txt = open(izhod, 'w') znotrajZnačke = False # ali se nahajamo v notranjosti for vrstica in html: izhodnaVrstica = '' for znak in vrstica: if znak in '<>': # če smo naleteli na začetek ali na konec značke znotrajZnačke = not znotrajZnačke else: # gre za nek drug znak if not znotrajZnačke : # če nismo v znački, znak dodamo izhodnaVrstica += znak txt.write(izhodnaVrstica) html.close() txt.close()
Sestavite funkcijo tabela(vhod, izhod)
, ki bo podatke iz vhodne
datoteke zapisala v obliki HTML tabele v izhodno datoteko.
V vhodni datoteki so podatki shranjeni po vrsticah ter ločeni z vejicami.
Na primer, če je v datoteki tabela.txt
zapisano:
ena,dva,tri
17,52,49.4,6
abc,xyz
bo po klicu tabela('tabela.txt', 'tabela.html')
v datoteki tabela.html
:
<table>
<tr>
<td>ena</td>
<td>dva</td>
<td>tri</td>
</tr>
<tr>
<td>17</td>
<td>52</td>
<td>49.4</td>
<td>6</td>
</tr>
<tr>
<td>abc</td>
<td>xyz</td>
</tr>
</table>
Pozor: Pazi na zamik (število presledkov na začetku vrstic) v izhodni datoteki.
def tabela(ime_vhodne, ime_izhodne): ''' zapis podatkov iz CSV datoteko v datoteko HTML v obliki tabele''' # naučimo se uporabljati stavek with! Tu ni uporabe metode close! with open(ime_vhodne) as vhodna: with open(ime_izhodne, 'w') as izhodna: print('<table>', file=izhodna) # začetek tabele for vrstica in vhodna: print(' <tr>', file=izhodna) # vska vrstica se začne z glavo vrstica = vrstica.strip() # znebimo se uvodnih in končnih 'belih' znakov podatki = vrstica.strip().split(',') #ločilni znak med podatki je vejica for podatek in podatki: # posamezni stolpci print(' <td>{0}</td>'.format(podatek), file=izhodna) print(' </tr>', file=izhodna) # konec vrstice print('</table>', file=izhodna) # konec tabele
Sestavite funkcijo seznami(vhod, izhod)
, ki bo podatke iz vhodne
datoteke zapisala v izhodno datoteko v obliki neurejenega seznama. V
vhodni datoteki se vrstice seznamov začnejo z zvezdico.
Na primer, če je v datoteki seznami.txt
zapisano:
V trgovini moram kupiti:
* jajca,
* kruh,
* moko.
Na poti nazaj moram:
* obiskati sosedo.
bo po klicu seznami('seznami.txt', 'seznami.html')
v datoteki seznami.html
:
V trgovini moram kupiti:
<ul>
<li>jajca,</li>
<li>kruh,</li>
<li>moko.</li>
</ul>
Na poti nazaj moram:
<ul>
<li>obiskati sosedo.</li>
</ul>
def seznami(ime_vhodne, ime_izhodne): '''Seznam na tekstovni datoteki prepišimo kot naštevni seznam v HTML''' seznam = False # ali smo znotraj obstoječega seznama vhodna = open(ime_vhodne) izhodna = open(ime_izhodne, 'w') for vrstica in vhodna: if vrstica[0] == '*': # z * so označeni elementi seznama if not seznam: # gre za nov seznam, zato ga ustvarimo! print('<ul>', file=izhodna) seznam = True print(' <li>{0}</li>'.format(vrstica[2:-1]), file=izhodna) # znebimo se uvodne * s presledkom, in \n s konca else: #'navadna vrstica' if seznam: # je potrebno zaključiti seznam? print('</ul>', file=izhodna) seznam = False print(vrstica, file=izhodna, end='') if seznam: print('</ul>', file=izhodna) # če je zadnji seznam šel do konca datoteke! vhodna.close() izhodna.close()
Sestavite funkcijo gnezdeni_seznami(vhod, izhod)
, ki bo podatke iz
vhodne datoteke zapisala v izhodno datoteko v obliki neurejenega gnezdenega
seznama. V vhodni datoteki je vsak element seznama v svoji vrstici, zamik
pred elementom pa določa, kako globoko je element gnezden.
Na primer, če je v datoteki seznami.txt
zapisano:
živali
sesalci
slon
ptiči
sinička
rastline
sobne rastline
difenbahija
bo po klicu gnezdeni_seznami('seznami.txt', 'seznami.html')
v datoteki
seznami.html
zapisano:
<ul>
<li>živali
<ul>
<li>sesalci
<ul>
<li>slon
</ul>
<li>ptiči
<ul>
<li>sinička
</ul>
</ul>
<li>rastline
<ul>
<li>sobne rastline
<ul>
<li>difenbahija
</ul>
</ul>
</ul>
Značk <li>
ne zapirajte.
def gnezdeni_seznami(ime_vhodne, ime_izhodne): '''iz "navadnega" gnezdenega seznama naredimo tak seznam v HTML''' nivo = 0 zamik = 2 # naučimo se uporabljati stavek with! Tu ni uporabe metode close! with open(ime_vhodne) as vhodna: with open(ime_izhodne, 'w') as izhodna: for vrstica in vhodna: # izračunaj na katerem nivoju sem # poiskati moramo prvi znak, ki ni presledek prviZnak = 0 for i in range(len(vrstica)): if vrstica[i] != ' ': break # našli smo ga prviZnak += 1 # ga še ni n = prviZnak // zamik + 1 # račun nivoja vrstica = vrstica.strip() #sedaj se lahko znebimo začetnih in končnih 'belih znakov' if n > nivo: # je potrebno začetni novo gnezdenje? print(2 * zamik * nivo * ' ' + '<ul>', file=izhodna, sep="") nivo += 1 while n < nivo: # končamo gnezdenje nivo -= 1 print(2 * zamik * nivo * ' ' + '</ul>', file=izhodna, sep="") print((2 * zamik * nivo - zamik) * ' ' + '<li>', vrstica, file=izhodna, sep="") while nivo > 0: # še končen zaključek gnezdenja nivo -= 1 print(2 * zamik * nivo * ' ' + '</ul>', file=izhodna, sep="")
Na vsakem zanimivem igrišču za golf so ovire: jezero, pesek, ...
Jezero
je krog, podan kot trojica (x,y,r)
.
Pesek
je pravokotnik, podan kot četverica(x1,y1,x2,y2)
. Predpostaviš lahko, da
so to po vrsti koordinate levega spodnjega in desnega zgornjega oglišča.
Vse koordinate računamo na tri decimalke (round(x, 3)
)
Na datoteki imamo zapisane podatke o posameznih udarcih v obliki polarnih koordinat.
V vsaki vrstici sta zapisani celi števili r
in f
, ločeni s presledkom.
Napišite metodo datotekaPolozajev(vhod, izhod)
, ki naj datoteko prebere in v tvori novo datoteko tako,
da je v vsaki vrstici
zapisan njen trenutni položaj (v obliki decimalnih števil, zaokroženih na 3 decimalna mesta)
in ločenih s presledkom. V ta namen uporabite formatiranje s pomočjo "{0:.3f}".format(x)
Začetni položaj naj bo v točki (0,0)
.
from math import * def datotekaPolozajev(vhod, izhod): '''Iz seznama udarcev, podanih v polarnih koordinatah, na datoteko zapiše kartezične koordinate položaja točk''' x,y = 0,0 g = open(izhod, "w") for vrstica in open(vhod): polarnekoordinate = vrstica.strip('\n').split(' ') r = int(polarnekoordinate[0]) fi = int(polarnekoordinate[1]) x += r * cos(fi * pi / 180) y += r * sin(fi * pi / 180) print("{0:.3f}".format(x), "{0:.3f}".format(y), file=g) g.close()
Podan je seznam položajev žogic po posameznem udarcu in seznam, katerega vsak element
je nabor, ki podaja jezero ali pesek. Napišite metodo seIzogne(pot, ovire)
, ki pove, ali
se pot v celoti izogne oviram. Pazi: jezero je podano z naborom treh, pesek pa z naborom štirih števil.
Najprej napišite metodi jeVJezeru(zogica, jezero)
in jeVPesku(zogica, pesek)
, ki
povesta, ali je žogica v jezeru ali v pesku. Žogica je podana kot par (x,y)
, torej "nima dimenzije".
def jeVJezeru(zogica, jezero): '''Ali je zogica znotraj jezera ''' (x0,y0) = zogica (x,y,r) = jezero # okroglo jezero return round((x-x0)**2 + (y-y0)**2,3) <= round(r**2, 3) def jeVPesku(zogica, pesek): '''Ali je zogica znotraj peska ''' (x0,y0) = zogica (xmin,ymin,xmax,ymax) = pesek # prakokotna peščena ovira return (xmin <= x0 <= xmax) and (ymin <= y0 <= ymax) def seIzogne(pot, ovire): '''Ali se žogice, katerih položaji so podani v seznamu pot izogne vsem oviram, podanih v seznamu ovire''' for tocka in pot: # za vsak položaj preverimo, če smo naleteli na kakšno oviro for ovira in ovire: if (len(ovira)==3 and jeVJezeru(tocka, ovira)): # žogica se znajde v jezeru return False if (len(ovira)==4 and jeVPesku(tocka, ovira)): # žogica se znajde v peščeni oviri return False return True
Napišite metodo kjeJeZogica(datoteka, zacetek, ovire)
, ki
vrne vektor od začenega do končnega položaja ali None,
če žogica kdaj vmes pade v oviro.
Posamezni udarci so v polarnih koordinatah zapisani na datoteko, začetek pa je
podan kot par (x,y)
.
def kjeJeZogica(datoteka, zacetek, ovire): '''Glede na seznam udarcev, podanem na datoteki datoteka, seznama ovir (seznam naborov) in začetnega položaja žogice ugotovi vektor od začetnega do končnega položaja žogice. Če žogica pristane v oviri, vrni None''' x,y = zacetek pot = [] pot.append((x,y)) # sestavimo seznam položajev žogice for vrstica in open(datoteka): polarnekoordinate = vrstica.strip('\n').split(' ') r = int(polarnekoordinate[0]) fi = int(polarnekoordinate[1]) x += r * cos(fi * pi / 180) y += r * sin(fi * pi / 180) pot.append((round(x,3),round(y,3))) # na koncu je žogica v (x, y) # uporabimo funkcijo prejšnje naloge if not seIzogne(pot, ovire): return None else: return (round(x-zacetek[0], 3),round(y-zacetek[0],3))